using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._Visibility
{
    /// <summary>
    /// <para>Skyline Barrier</para>
    /// <para>Generates a multipatch feature class representing a skyline barrier or shadow volume.</para>
    /// <para>生成表示天际线障碍或阴影体积的多面体要素类。</para>
    /// </summary>    
    [DisplayName("Skyline Barrier")]
    public class SkylineBarrier : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public SkylineBarrier()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_observer_point_features">
        /// <para>Input Observer Point Features</para>
        /// <para>The point feature class containing the observer points.</para>
        /// <para>包含观察点的点要素类。</para>
        /// </param>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The input line feature class which represents the skylines, or the input multipatch feature class which represents the silhouettes.</para>
        /// <para>表示天际线的输入线要素类，或表示侧面影像的输入多面体要素类。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output  Feature Class</para>
        /// <para>The output feature class into which the skyline barrier or shadow volume is placed.</para>
        /// <para>放置天际线障碍或阴影体积的输出要素类。</para>
        /// </param>
        public SkylineBarrier(object _in_observer_point_features, object _in_features, object _out_feature_class)
        {
            this._in_observer_point_features = _in_observer_point_features;
            this._in_features = _in_features;
            this._out_feature_class = _out_feature_class;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Skyline Barrier";

        public override string CallName => "3d.SkylineBarrier";

        public override List<string> AcceptEnvironments => ["XYDomain", "ZDomain", "autoCommit", "configKeyword", "extent", "geographicTransformations", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_in_observer_point_features, _in_features, _out_feature_class, _min_radius_value_or_field, _max_radius_value_or_field, _closed.GetGPValue(), _base_elevation, _project_to_plane.GetGPValue()];

        /// <summary>
        /// <para>Input Observer Point Features</para>
        /// <para>The point feature class containing the observer points.</para>
        /// <para>包含观察点的点要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Observer Point Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_observer_point_features { get; set; }


        /// <summary>
        /// <para>Input Features</para>
        /// <para>The input line feature class which represents the skylines, or the input multipatch feature class which represents the silhouettes.</para>
        /// <para>表示天际线的输入线要素类，或表示侧面影像的输入多面体要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Output  Feature Class</para>
        /// <para>The output feature class into which the skyline barrier or shadow volume is placed.</para>
        /// <para>放置天际线障碍或阴影体积的输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output  Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Minimum Radius</para>
        /// <para>The minimum radius to which triangle edges should be extended from the observer point. The default is 0, meaning no minimum.</para>
        /// <para>三角形边应从观察点延伸至的最小半径。默认值为 0，表示没有最小值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Minimum Radius")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _min_radius_value_or_field { get; set; } = null;


        /// <summary>
        /// <para>Maximum Radius</para>
        /// <para>The maximum radius to which triangle edges should be extended from the observer point. The default is 0, meaning no maximum.</para>
        /// <para>三角形边应从观察点延伸到的最大半径。默认值为 0，表示没有最大值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Maximum Radius")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _max_radius_value_or_field { get; set; } = null;


        /// <summary>
        /// <para>Closed</para>
        /// <para><xdoc>
        ///   <para>Whether to close the skyline barrier with a skirt and a base so that the resulting multipatch will appear to be a solid.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—No skirt or base is added to the multipatch; just the multipatch representing the surface going from the observer to the skyline is represented. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked— A skirt and a base are added to the multipatch so as to form what appears to be a closed solid.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>是否用裙子和底座关闭天际线屏障，以便由此产生的多面体看起来是实心的。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 未向多面体添加裙边或底座;仅表示表示从观察点到天际线的表面的多面体。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>Checked（格子）— 将裙边和底座添加到多面体中，以形成看似闭合的实体。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Closed")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _closed_value _closed { get; set; } = _closed_value._false;

        public enum _closed_value
        {
            /// <summary>
            /// <para>CLOSED</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("CLOSED")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_CLOSED</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_CLOSED")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Base Elevation</para>
        /// <para>The elevation of the base of the closed multipatch; it is ignored if the barrier is not to be closed. The default is 0.</para>
        /// <para>闭合多面体底部的高程;如果屏障不关闭，则忽略它。默认值为 0。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Base Elevation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _base_elevation { get; set; } = null;


        /// <summary>
        /// <para>Project to Plane</para>
        /// <para><xdoc>
        ///   <para>Whether the front (nearer to the observer) and back (farther from the observer) ends of the barrier should each be projected onto a vertical plane. This is typically checked (turned on) in order to create a shadow volume.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—The barrier will extend from the observer point to the skyline (or nearer or farther if nonzero values are provided for minimum and maximum radius). This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—The barrier will extend from a vertical plane to a vertical plane.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>屏障的前端（靠近观察者）和后端（离观察者较远）是否应分别投影到垂直平面上。通常选中（打开）此功能以创建影子卷。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 障碍将从观察点延伸到天际线（如果为最小和最大半径提供了非零值，则更近或更远）。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 障碍将从垂直平面延伸到垂直平面。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Project to Plane")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _project_to_plane_value _project_to_plane { get; set; } = _project_to_plane_value._false;

        public enum _project_to_plane_value
        {
            /// <summary>
            /// <para>PROJECT_TO_PLANE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("PROJECT_TO_PLANE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_PROJECT_TO_PLANE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_PROJECT_TO_PLANE")]
            [GPEnumValue("false")]
            _false,

        }

        public SkylineBarrier SetEnv(object XYDomain = null, object ZDomain = null, int? autoCommit = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, ZDomain: ZDomain, autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}